package pikasial.images;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Observable;

import pikasial.fs.Dossier;

/**
 * Cette classe contient la liste des albums importés par l'utilisateur.
 * @author ESIAL - Groupe 14
 */
public final class ListeAlbums extends Observable {

    public static final int DOSSIER = 95;
    public static final int ALBUM = 96;
    public static final int NOTIF_DOSSIER = 112;
    public static final int NOTIF_ALBUM = 113;

    private static ListeAlbums instance = new ListeAlbums();
    private final List<Dossier> dossiers;
    private final List<AlbumPhotos> albums;
    private ImageContainer albumAffiche;

    private ListeAlbums() {
    	dossiers = Collections.synchronizedList(new ArrayList<Dossier>());
        albums = Collections.synchronizedList(new ArrayList<AlbumPhotos>());
    }

    public void ajouterAlbum(AlbumPhotos ap) {
        albums.add(ap);
        setChanged();
        notifyObservers(NOTIF_ALBUM);
    }

    public void ajouterDossier(Dossier d) {
        dossiers.add(d);
        setChanged();
        notifyObservers(NOTIF_DOSSIER);
    }

    public void supprimerDossier(int index) {
        dossiers.remove(index);
        setChanged();
        notifyObservers(NOTIF_DOSSIER);
    }

    public void supprimerAlbum(int index) {
        albums.remove(index);
        setChanged();
        notifyObservers(NOTIF_ALBUM);
    }

    public int getNombreDossier() { return dossiers.size(); }

    public int getNombreAlbums() { return albums.size(); }

    public Dossier getDossier(int index) {
        return dossiers.get(index);
    }

    public AlbumPhotos getAlbum(int index) {
        return albums.get(index);
    }

    public Collection<AlbumPhotos> getAllAlbums() {
        return albums;
    }

    public Collection<Dossier> getAllDossiers() {
        return dossiers;
    }

    public void setAlbumAffiche(ImageContainer ic) {
    	synchronized (this) {
    		albumAffiche = ic;
    	}
    	setChanged();
    	notifyObservers(ic);
    }

    public void setAlbumAffiche(int index, int type) {
    	synchronized (this) {
    		if (type == DOSSIER) {
    			albumAffiche = getDossier(index);
    		} else if (type == ALBUM) {
    			albumAffiche = getAlbum(index);
    		}
    	}
    	setChanged();
    	notifyObservers(albumAffiche);
    }

    public synchronized ImageContainer getAlbumAffiche() { return albumAffiche; }

    public int indexOfDossier(Dossier d) {
        return dossiers.indexOf(d);
    }

    public int indexOfAlbum(AlbumPhotos ap) {
        return albums.indexOf(ap);
    }

    public boolean containsAlbum(String nom) {
        boolean trouve = false;
        for (AlbumPhotos ap : albums) {
            if (ap.getName().equals(nom)) {
                trouve = true;
                break;
            }
        }
        return trouve;
    }

    public boolean containsDossier(String nom) {
        boolean trouve = false;
        for (Dossier d : dossiers) {
        	if (d.getName().equals(nom)) {
        		trouve = true;
        		break;
        	}
        }
        return trouve;
    }

    public static ListeAlbums getInstance() {
        return instance;
    }
}
